import axios, { AxiosRequestConfig } from 'axios'
import { ElMessage, ElMessageBox } from 'element-plus'
import { store } from '@/store'
import router from '@/router'

const request = axios.create({
  baseURL: import.meta.env.VITE_API_BASEURL
})

// 请求拦截器
request.interceptors.request.use(
  config => {
    // 统一设置用户身份 Token
    const user = store.state.user
    if (user && user.token) {
      config.headers.Authorization = `Bearer ${user.token}`
    }
    return config
  },
  error => {
    return Promise.reject(error)
  }
)
let isRefresh = false
// 响应拦截器
request.interceptors.response.use(
  (response) => {
    // 统一处理响应错误，例如 token 无效、服务端异常等
    if (!response.data.status || response.data.status === 200) {
      return response
    }
    if (response.data.status === 410000) {
      if (isRefresh) return Promise.reject(response)
      isRefresh = true
      ElMessageBox.confirm('您的登录已过期， 您可以取消停留在此页面，或者重新登录', '登录过期', {
        confirmButtonText: '确认',
        cancelButtonText: '取消'
      }).then(() => {
        store.commit(
          'setUser',
          null
        )
        router.push({
          name: 'login',
          query: {
            redirect: router.currentRoute.value.fullPath
          }
        })
      }).finally(() => {
        isRefresh = false
      })
      // 内部消化掉这个业务异常
      return Promise.reject(response)
    }
    // 其它错误情况
    ElMessage.error(response.data.msg || '请求失败，请联系管理员')
    return Promise.reject(response.data)
    // if (response.data.status && response.data.status !== 200) {
    //   ElMessage.error(response.data.msg || '请求失败，请联系管理员')
    //   return Promise.reject(response.data)
    // }
    // return response
  },
  err => {
    return Promise.reject(err)
  }
)

export default <T = any>(config: AxiosRequestConfig) => {
  return request(config).then(res => {
    return (res.data.data || res.data) as T
  })
}
